/*
给出一个二维整数网格 grid，网格中的每个值表示该位置处的网格块的颜色。
只有当两个网格块的颜色相同，而且在四个方向中任意一个方向上相邻时，它们属于同一连通分量。
连通分量的边界是指连通分量中的所有与不在分量中的正方形相邻（四个方向上）的所有正方形，或者在网格的边界上（第一行/列或最后一行/列）的所有正方形。
给出位于 (r0, c0) 的网格块和颜色 color，使用指定颜色 color 为所给网格块的连通分量的边界进行着色，并返回最终的网格 grid 。
示例 1：
输入：grid = [[1,1],[1,2]], r0 = 0, c0 = 0, color = 3
输出：[[3, 3], [3, 2]]
示例 2：
输入：grid = [[1,2,2],[2,3,2]], r0 = 0, c0 = 1, color = 3
输出：[[1, 3, 3], [2, 3, 3]]
示例 3：
输入：grid = [[1,1,1],[1,1,1],[1,1,1]], r0 = 1, c0 = 1, color = 2
输出：[[2, 2, 2], [2, 1, 2], [2, 2, 2]]
提示：
1 <= grid.length <= 50
1 <= grid[0].length <= 50
1 <= grid[i][j] <= 1000
0 <= r0 < grid.length
0 <= c0 < grid[0].length
1 <= color <= 1000
通过次数3,367提交次数7,892
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/coloring-a-border
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
/*
 * @Author: gxx
 * @QQ:1278255275
 * @Date: 2021-04-07 15:29:54
 * @Last Modified by: gxx
 * @Last Modified time: 2021-04-07 15:29:54
 * @Description: 边框着色
*/

#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

int main(int agrc, char ** agrv){
    
    
    return 0;   
}

class Solution {
public:
    vector<vector<int>> colorBorder(vector<vector<int>>& grid, int r0, int c0, int color) {
        int x = grid.size();
        int y = grid[0].size();
        vector<vector<bool>>visited;
        visited.resize(grid.size());
        for(int i = 0; i < visited.size();i++){
            visited[i].resize(grid[i].size());
        }
        for(int i = 0; i < visited.size(); i++){
            for(int j = 0; j < visited[i].size();j++)
            visited[i][j] = false;
        }
        int origColor = grid[r0][c0];
        fill(grid,r0,c0,origColor,color);
        return grid;
    }

    int fill(vector<vector<int>>&grid,vector<vector<int>>&visited,int r0,int c0, int origColor,int color){
        if(!inArea(grid,r0,c0)) return 0;
        if(visited[r0][c0]) return 1;
        if(grid[r0][c0] != origColor) return 0;
        visited[r0][c0] = true;

        int sourrnd = \
        fill(grid,r0-1,c0,origColor,color) + 
        fill(grid,r0+1,c0,origColor,color) + 
        fill(grid,r0,c0-1,origColor,color) + 
        fill(grid,r0,c0+1,origColor,color);

        if(sourrnd < 4) 
        grid[r0][c0] = color;
        return 1; 
    }

    bool inArea(vector<vector<int>>&grid, int r0, int c0){
        return r0 >=0 && r0 < grid.size() && c0 >=0 && c0 < grid[0].size();
    }
};
/*
int fill(int [][] image, int x, int y,int origColor, int newColor){
    if(!inArea(imagex,y)) return 0;
    if(visited[x][y]) return 1;

    if(image[x][y] != origColor) return 0;

    visted[x][y] = true;
    int surround = \
    fill(image,x-1,y,origColor,newColor) + \
    fill(image,x+1,y,origColor,newColor) + \
    fill(image,x,y-1,origColor,newColor) + \
    fill(image,x,y+1,origColor,newColor);

    if(surroound < 4)
    image[x][y] = newColor;

    return 1;
}
